package com.fjc.service.Impl;

import com.fjc.constant.MessageConstant;
import com.fjc.constant.PasswordConstant;
import com.fjc.constant.StatusConstant;
import com.fjc.dto.AdminDTO;
import com.fjc.dto.AdminLoginDTO;
import com.fjc.dto.AdminPageQueryDTO;
import com.fjc.entity.Admin;
import com.fjc.exception.AccountLockedException;
import com.fjc.exception.AccountNotFoundException;
import com.fjc.exception.PasswordErrorException;
import com.fjc.mapper.AdminMapper;
import com.fjc.result.PageResult;
import com.fjc.service.AdminService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.List;


@Service
public class AdminServiceImpl implements AdminService {
    @Autowired
    private AdminMapper adminMapper;


    /**
     * 管理员登录
     *
     * @param adminLoginDTO
     * @return
     */
    public Admin login(AdminLoginDTO adminLoginDTO) {
        String username = adminLoginDTO.getUsername();
        String password = adminLoginDTO.getPassword();

        //1、根据用户名查询数据库中的数据
        Admin admin = adminMapper.getByUsername(username);

        //2、处理各种异常情况（用户名不存在、密码不对、账号被锁定）
        if (admin == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        //密码比对
        // 对前端传过来的明文密码进行加密处理
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        if (!password.equals(admin.getPassword())) {
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        if (admin.getStatus() == StatusConstant.DISABLE) {
            //账号被锁定
            throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
        }

        //3、返回实体对象
        return admin;
    }

    /**
     * 新增管理员
     * @param adminDTO
     */
    public void save(AdminDTO adminDTO) {
        System.out.println("当前线程的id:" + Thread.currentThread().getId());

        Admin admin = new Admin();

        // 对象属性拷贝
        BeanUtils.copyProperties(adminDTO, admin);

        // 设置账号的状态，默认正常状态   1 表示正常 | 0 表示锁定
        admin.setStatus(StatusConstant.ENABLE);

        // 设置密码， 默认密码123456
        admin.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));

        // 设置当前记录的创建时间和修改时间
//        admin.setCreateTime(LocalDateTime.now());
//        admin.setUpdateTime(LocalDateTime.now());
        // 设置当前记录人id和修改人id
//        admin.setCreateUser(BaseContext.getCurrentId());
//        admin.setUpdateUser(BaseContext.getCurrentId());
        adminMapper.insert(admin);

    }

    /**
     * 分页查询
     * @param adminPageQueryDTO
     * @return
     */
    public PageResult pageQuery(AdminPageQueryDTO adminPageQueryDTO) {
        // 开始分页查询
        PageHelper.startPage(adminPageQueryDTO.getPage(), adminPageQueryDTO.getPageSize());

        Page<Admin> page = adminMapper.pageQuery(adminPageQueryDTO);

        long total = page.getTotal();   // 总记录数
        List<Admin> records = page.getResult();  // 显示当前页的员工对象
        return new PageResult(total, records);
    }

    /**
     * 启用禁用管理员账号
     * @param status
     * @param id
     */
    public void startOrStop(Integer status, long id) {
        Admin admin = Admin.builder()
                .status(status)
                .id(id)
                .build();
        adminMapper.update(admin);
    }

    /**
     * 根据id查询管理员信息
     * @param id
     * @return
     */
    public Admin getById(long id) {
        Admin employee = adminMapper.getById(id);
        // 避免密码泄露
        employee.setPassword("****");
        return employee;
    }

    /**
     * 编辑管理员信息
     * @param adminDTO
     */
    @Override
    public void update(AdminDTO adminDTO) {
        Admin admin = new Admin();
        BeanUtils.copyProperties(adminDTO, admin);
        // 设置修改时间
//        admin.setUpdateTime(LocalDateTime.now());
        // 设置修改人的id
//        admin.setUpdateUser(BaseContext.getCurrentId());

        adminMapper.update(admin);
    }

}
